/* eslint-disable space-before-function-paren */
// 导入axios
import axios from 'axios'
// 导入store实例
import store from '@/store'
// 引用Message消息提示函数
import { Message } from 'element-ui'
// 导入router实例
import router from '@/router'

// 同源：协议/域名/端口 三个都必须一样才能同源
// 跨域：处于浏览器的限制，以上三条有一个不同就会跨域
// 创建axios实例
const service = axios.create({
  // 基地址
  baseURL: process.env.VUE_APP_BASE_API, // http://ihrm.itheima.net/api
  timeout: 5000 // request timeout--请求超时时间
})

// 请求拦截器
// request interceptor
service.interceptors.request.use(
  (config) => {
    const { token } = store.state.user
    if (token) {
      // 如果有token，
      // 通过请求头携带给后台，给headers添加Authorization属性
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  (error) => Promise.reject(error)
)

// 响应拦截器
// response interceptor
service.interceptors.response.use(
  (resp) => {
    // 解构
    const { data } = resp
    // 请求成功
    if (data.success) {
      // 直接返回data数据
      return data
    }
    // 请求失败，返回一个失败态的Promise实例
    return Promise.reject(data)
  },
  async (err) => {
    console.dir(err)
    // 判断token过期状态码
    if (err.response.status === 401 && err.response.data.code === 10002) {
      // 给出token过期提示
      Message.error('令牌过期，请重新登录')
      // 清空vuex中的token和用户信息
      await store.dispatch('user/logoutAction')
      // 跳转至登录，并携带回跳地址
      router.replace(`/login?redirectUrl=${router.currentRoute.fullPath}`)
    }
    return Promise.reject(err)
  }
)

// 导出请求示例
export default service
